<?php

namespace App\Console\Commands;

use App\Models\AdminModule;
use App\Models\ContentTemplateModel;
use Illuminate\Console\Command;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;

class ModuleCommand2 extends Command
{

    protected $signature = 'dh-start';

    protected $description = '数据迁移文件执行完成后,调用这个命令进行网站的初始化操作';


    protected $message;

    public function __construct()
    {
        parent::__construct();
        $this->message = '命令执行成功,网站初始化操作完成';
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
//        dd(ContentTemplateModel::loadTemplate()->first()->fill(['using'=>1,'author'=>'dh222','title'=>'aa','site'=>'baidu','preview'=>'as','name'=>'wo','package'=>'womene'])->save());
        //网站初始化操作主要要完成以下动作
        //1.检测模块儿,并将模块儿的配置文件(app.php)和权限文件(permission.php)中的内容推入admin_modules表中
        //2.读取各个模块儿中权限文件中的内容,并存入permission权限表中
        //3.刷新网站模板,并默认选中一个模板
        //4.更新超级管理员的权限
        $dirs = 'App/Http/Controllers/*';
        foreach (glob($dirs) as $dir) {
            //遍历$dirs这个目录
            if ($this->isModule($dir)):
                //如果遍历的当前目录是一个模块儿目录,将相关信息存入admin_modules表中
                $this->storeApps($dir);
                //之后将模块儿的权限信息存到permission权限表中
                $this->storePermission($dir);
            endif;
        }
        //上面执行完成后,将各个模块儿的配置信息和权限信息都保存到相应的表中之后,刷新网站模板,并默认选中一个模板
        //fill([attribute])用属性数组来填充一个模型.save()是修改属性并保存.create是创建一个新的数据
        ContentTemplateModel::loadTemplate()->first()->fill(['using' => 1])->save();
        //将权限表permission表中的所有权限都赋值给Role角色表中的超级管理员
        $this->assignAllPermission();
        //最后返回提示信息
        $this->info($this->message);
    }

//        判断目录是不是模块儿目录的方法
    protected function isModule($name)
    {
//        判断给定文件名是否为一个正常的文件
      return  is_file($name . '/config/app.php');
    }

    //向admin_modules表中存入相关数据的方法
    protected function storeApps(String $name)
    {
        $modules = include $name . '/config/app.php';
        $modules['config'] = $modules;
        //$modules['module']中存放的是当前模块儿名
        $modules['module'] = basename($name);
        $modules['permission'] = $this->getPermissions($name);
        $file = $name.'/config/menus/admin.php';
        //判断模块儿config文件夹中menus/admin.php是否存在,如果存在的话就把文件中的内容放到相应modules中的admin_menu字段中
        //这里使用了一个三元表达式
        $modules['admin_menu'] = is_file($file)?include $file:null;
        //将会员中心菜单配置文件中的内容配置到放到AdminModule的后台数据表中
        $file = $name.'/config/menus/center.php';
        //通过下面的代码可以达到的效果是当模块儿中配置有会员中心的菜单的配置文件的时候就会将会员中心配置文件中的内容压入$modules表的center_menu字段中
        $modules['center_menu'] = is_file($file)?include $file:null;
        // 通过属性找到第一条相匹配的数据或实例化一条新数据
        //Model::firstOrNew(array('key' => 'value'));
        //按照模块儿名不能重复,按照模块儿名进行查找,如果有就更新,没有就新建
        AdminModule::firstOrNew(['module' => $modules['module']])->fill($modules)->save();
    }

    //在各个模块权限名称前面加上模块儿前缀,方便区分
    protected function getPermissions($name)
    {
        $path = $name . '/config/permission.php';
        if (is_file($path)) {
            $permissions = include $path;
            foreach ($permissions as $k => $permission) {
                $permissions[$k]['name'] = basename($name) . '-' . $permission['name'];
            }
            return $permissions;
        } else
            return [];
    }

    //将模块儿的权限信息存放到permission权限表中
    protected function storePermission($name)
    {
        $permission = $this->getPermissions($name);
        foreach ($permission as $value) {
            Permission::firstOrNew(['name' => $value['name']])->fill($value)->save();
        }

    }

    //给Role角色表中的"超级管理员"分配所有权限
    protected function assignAllPermission()
    {
//        //先获取permission权限数组
        $permissions = Permission::get();
        foreach ($permissions as $permission) {
//            //然后从Role角色表中找到"超级管理员",并分配权限
            Role::where(['system' => 1, 'name' => 'daoheng'])->first()->givePermissionTo($permission);
        }
//
    }


}
